package com.ftg.learn.day10.factory;


import com.ftg.learn.day09.exam02.Dog;

/**
 * 类实例化工厂
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/8/11 上午10:07
 */
public class BeanFactory {



    public static Object getInstance(String str) {

        //通过类地址 "com.ftg.learn.day09.exam02.Dog"
        try{
            Class c1 = Class.forName(str);

//            Constructor constructor = c1.getConstructor(null);
//
//            return constructor.newInstance();

            // - newInstance
            return c1.newInstance();
        }catch (ClassNotFoundException | InstantiationException | IllegalAccessException e){
            System.out.println("杀了它");
        }
        return null;

        //反射
        // java 原始引用类型 public class Class
        //  Class : 所有在jvm当中的类或者接口的关联类型
            // 有几种找到你的方式 .
        //  Method
            //所有方法的关联对象.
        //  Field
            //所有属性的关联对象.
    }

    //泛型
    public  static <x> x getInstance(Class<x> c) throws InstantiationException, IllegalAccessException {
        //第二种实例化方法
        return c.newInstance();
    }


    public static void main(String[] args) throws InstantiationException, IllegalAccessException {

        //第三种  实例.getClass();
        Dog d4 = new Dog();
        Class c5 = d4.getClass();

        System.out.println("第二种方式");
        Dog d3 = BeanFactory.getInstance(Dog.class);


//        通过类名直接获取
        Object o2 = BeanFactory.getInstance(Dog.class);
        Dog dog2 = (Dog) o2;
        dog2.setName("张三丰");

        System.out.println(dog2.getName());


        Object obj = BeanFactory.getInstance("com.ftg.learn.day09.exam02.Dog");
        Dog d1 = (Dog) obj;
        d1.setName("sss");
        System.out.println(d1.getName());

        //如何将字符串变成 类的实例
//        try{
//            System.out.println(2 /0);
//        }catch (ArithmeticException e){
////            e.printStackTrace();
//            System.out.println("这是我自己处理以后");
//            System.out.println(e.getMessage());
//            System.err.println(e.getMessage());
//        }

    }

}
